package com.csun.cmny.provider.web.frontend;

import com.csun.cmny.core.annotation.ValidateAnnotation;
import com.csun.cmny.provider.model.dto.pay.OnlinePayParam;
import com.csun.cmny.provider.utils.UtilDate;
import com.csun.cmny.provider.utils.alipay.AliPayConfig;
import com.csun.cmny.provider.utils.alipay.AlipayTrade;
import com.csun.cmny.provider.utils.unionpay.UnionPayTrade;
import com.csun.cmny.provider.validator.OnlinePayParamValid;
import com.csun.cmny.util.ValidateUtil;
import com.csun.cmny.util.wrapper.WrapMapper;
import com.google.common.collect.Maps;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.springframework.http.MediaType;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * @Auther: chisj chisj@foxmal.com
 * @Date: 2020-05-25 17:21
 * @Description:
 */
@RestController
@RequestMapping(value = "/api", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public class OnlinePaymentController {

    /**
     * 在线支付
     */
    @ValidateAnnotation
    @RequestMapping(value = "/onlinePay")
    public void onlinePay(HttpServletResponse response, HttpServletRequest request,
                          @Validated(value = {OnlinePayParamValid.class}) OnlinePayParam param, BindingResult br)
            throws ServletException, IOException {
        /* 返回上传结果 */
        response.setCharacterEncoding("UTF-8");
        /* 解决文件上传跨域问题 */
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("origin"));
        response.setContentType("text/html;charset=" + AliPayConfig.CHARSET);

        boolean result = true;
        String form = null;

//        TokenModel model = tokenManager.getToken(param.getToken());
//	    if (!tokenManager.checkToken(model)) {
//	        //如果token验证失败
//	        result = false;
//	        errorMap.put("token", "token验证失败");
//	    }

        if (!result) {
            /* 返回错误信息 */
            //JSONObject jsObject =JSONObject.fromObject(new JsonResult(false,"在线支付参数检验失败", errorMap));
            //form = new String(jsObject.toString().getBytes("ISO-8859-1"),"UTF-8");
            //form = jsObject.toString();
        } else {
            String orderId = UtilDate.getOrderNum();
//            DecimalFormat df = new DecimalFormat("#,#00.00#");
            // 只保留两位小数
            BigDecimal totalAount = param.getTotalAmount().setScale(2, BigDecimal.ROUND_DOWN);
            if (0 == param.getPayType()) {
                // 银联支付 - 手机控件支付
                UnionPayTrade unionPayTrade = new UnionPayTrade();
                Map<String,String> paramMap = new HashMap<String,String>();
                // 乘以100
                paramMap.put("txnAmt", totalAount.scaleByPowerOfTen(2).toString());  //交易金额，单位分，不要带小数点
                paramMap.put("orderId", orderId);
                Map<String, String> rspData = unionPayTrade.appConsume(paramMap, null);
                JSONObject jsObject =JSONObject.fromObject(WrapMapper.ok(rspData));
                // 设置响应头类型
                response.setContentType("application/json;charset=UTF-8");

                form = new String(jsObject.toString().getBytes("UTF-8"),"UTF-8").toString();
            } if (1 == param.getPayType()) {
                // 银联支付 - 网关支付
                UnionPayTrade unionPayTrade = new UnionPayTrade();
                Map<String,String> paramMap = new HashMap<String,String>();
                paramMap.put("txnAmt", totalAount.scaleByPowerOfTen(2).toString());  //交易金额，单位分，不要带小数点
                paramMap.put("orderId", orderId);
                // 订单超时时间。
                // 超过此时间后，除网银交易外，其他交易银联系统会拒绝受理，提示超时。 跳转银行网银交易如果超时后交易成功，会自动退款，大约5个工作日金额返还到持卡人账户。
                // 此时间建议取支付时的北京时间加15分钟。
                // 超过超时时间调查询接口应答origRespCode不是A6或者00的就可以判断为失败。
                paramMap.put("payTimeout", new SimpleDateFormat("yyyyMMddHHmmss").format(new Date().getTime() + 15 * 60 * 1000));
                form = unionPayTrade.tokenOpen(paramMap, null);
            }
            if (2 == param.getPayType()) {
                // 支付宝支付 -- 网关支付
                AlipayTrade alipayTrade = new AlipayTrade();
                Map<String,String> paraMap = new HashMap<String,String>();
                paraMap.put("out_trade_no", orderId);	// 订单号
                //paraMap.put("out_trade_no", System.currentTimeMillis()+"");	// 订单号
                paraMap.put("total_amount", totalAount.toString());	// 充值金额
                paraMap.put("subject","谷物干燥机款项");		// 名称
                /**
                 *  所有支付接口开始计时都是订单创建开始计时，不同接口对于timeout_express计时方式是不同的。
                 *  取值范围：1m～15d。m-分钟，h-小时，d-天，1c-当天（1c-当天的情况下，无论交易何时创建，都在0点关闭）。
                 *  该参数数值不接受小数点， 如 1.5h，可转换为 90m。
                 *  如果不设置该参数默认15天订单关闭
                 */
                paraMap.put("timeout_express", "15m");	// 过期时间
                if (StringUtils.isNotBlank(param.getBody())) {
                    paraMap.put("body", param.getBody());	// 备注
                } else {
                    paraMap.put("body", "暂无付款说明");
                }
                paraMap.put("product_code","QUICK_WAP_PAY");	// 支付方式
                form = alipayTrade.TradeWapPayRequest(paraMap);
            } if (3 == param.getPayType()) {

                // 支付宝支付 -- app支付
                AlipayTrade alipayTrade = new AlipayTrade();
                Map<String,String> paraMap = new HashMap<String,String>();
                paraMap.put("out_trade_no", orderId);	// 订单号
                //paraMap.put("out_trade_no", System.currentTimeMillis()+"");	// 订单号
                paraMap.put("total_amount", totalAount.toString());	// 充值金额
                paraMap.put("subject","守护佳智能看护系统");		// 名称
                /**
                 *  所有支付接口开始计时都是订单创建开始计时，不同接口对于timeout_express计时方式是不同的。
                 *  取值范围：1m～15d。m-分钟，h-小时，d-天，1c-当天（1c-当天的情况下，无论交易何时创建，都在0点关闭）。
                 *  该参数数值不接受小数点， 如 1.5h，可转换为 90m。
                 *  如果不设置该参数默认15天订单关闭
                 */
                paraMap.put("timeout_express", "15m");	// 过期时间
                if (StringUtils.isNotBlank(param.getBody())) {
                    paraMap.put("body", param.getBody());	// 备注
                } else {
                    paraMap.put("body", "暂无付款说明");
                }
                paraMap.put("product_code","QUICK_MSECURITY_PAY");	// 支付方式
                form = alipayTrade.TradeAppPayRequest(paraMap);

                Map<String, String> out = Maps.newHashMap();
                out.put("tn", form);

                JSONObject jsObject =JSONObject.fromObject(WrapMapper.ok(out));
                // 设置响应头类型
                response.setContentType("application/json;charset=UTF-8");

                form = new String(jsObject.toString().getBytes("UTF-8"),"UTF-8").toString();
            }

            // 创建支付工单
//            PayOrder payOrder = new PayOrder();
//            payOrder.setOrderId(orderId);
//            payOrder.setBody(param.getBody());
//            payOrder.setAmount(param.getTotalAmount().toString());
//            //payOrder.setUserId(model.getUserId());
//            payOrder.setForm(form);
//            payOrderService.payOrderCreat(payOrder);
        }

        response.getWriter().write(form); //直接将完整的表单html输出到页面
        response.getWriter().flush();
        response.getWriter().close();
    }

    /**
     * 阿里在线支付成功处理
     */
    @RequestMapping(value = "/aliPayNotify")
    public void aliPayNotify(HttpServletResponse response, HttpServletRequest request) {

        Map<String,String> params = new HashMap<String,String>();
        Map requestParams = request.getParameterMap();
        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            }
            //乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
            params.put(name, valueStr);
        }

//        PayOrder payOrder = payOrderService.getPayOrder(params.get("out_trade_no"));
//        if (payOrder != null) {
//            Record record = new Record();
//            record.setAcceptAccount(params.get("seller_email"));
//            record.setAcceptName("小禾科技");
//            record.setAmount(Integer.parseInt(payOrder.getAmount()));
//            record.setOrderNo(params.get("out_trade_no"));
//            record.setPayAccount(params.get("buyer_logon_id"));
//            record.setPayDate(TimeUtils.getNowTime()); // params.get("gmt_payment")
//            record.setPayType("支付宝在线支付");
//            record.setRemark(payOrder.getBody());
//            record.setUserId(payOrder.getUserId());
//            recordService.addRecord(record);
//        }

        System.out.println("aliPayNotify params = " + params.toString());
    }

    /**
     * 银联在线支付成功处理
     */
    @RequestMapping(value = "/unionPayNotify")
    public void unionPayNotify(HttpServletResponse response, HttpServletRequest request) {
        Map<String,String> params = new HashMap<String,String>();
        Map requestParams = request.getParameterMap();
        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            }
            //乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
            params.put(name, valueStr);
        }

//        PayOrder payOrder = payOrderService.getPayOrder(params.get("orderId"));
//        if (payOrder != null) {
//            Record record = new Record();
//            record.setAcceptAccount(params.get("merId"));
//            record.setAcceptName("小禾科技");
//            record.setAmount(Integer.parseInt(payOrder.getAmount()));
//            record.setOrderNo(params.get("orderId"));
//            record.setPayAccount(params.get("accNo"));
//            record.setPayDate(TimeUtils.getNowTime());
//            record.setPayType("银联在线支付");
//            record.setRemark(payOrder.getBody());
//            record.setUserId(payOrder.getUserId());
//            recordService.addRecord(record);
//        }

        System.out.println("unionPayNotify params = " + params.toString());

    }

}
